#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <pthread.h>
#include <unistd.h> 

using namespace std;

struct thread_data{
    pthread_t tid;
    string name;
};



// 启动函数
void *thread_func(void *arg){
    thread_data *data = (thread_data *)arg;  // 类型转换
    int i = 0;
    cout << "pid: " << getpid() << ", tid: " << data->tid << ", name: " << data->name << "i: "<< i << " &i: " << &i << endl;
    puts("");
    i ++;
    sleep(1);
    return NULL;
}
int main(){
    vector<pthread_t> tids;  // 所有的线程
    for (int i = 0; i < 10; i++){   // 创建10个线程
        pthread_t tid;
  
        thread_data *data = new thread_data;  // 必须创建堆变量，不然会子线程隐形持有主线程数据，造成内存泄漏
        // 这样每个线程都有 一小块堆空间，保存自己的信息
       data->tid = tid; 
       data->name = "thread-" + to_string(i);

        pthread_create(&tid, NULL, thread_func, data);
        tids.push_back(tid);
    }
    
    for(int i = 0; i < tids.size(); i++){
        pthread_detach(tids[i]);
    }

    puts("");
    puts("");
    for(int i = 0; i < tids.size(); i++){   // 线程等待
        int n = pthread_join(tids[i], NULL);
        cout  << "thread " << i << " exit, n: " << strerror(n) << endl;
    }


    return 0;
}